﻿using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace _060_简单的TCP通信程序
{
    class Program
    {
        static void Main(string[] args)
        {
            Task t1 = Task.Run((Action)服务器端);
            Task t2 = Task.Run((Action)客户接收);

            Task.WaitAll(t1,t2);
            Console.Read();

        }

        //服务器端
        static void 服务器端()
        {
           Socket  服务器 = new Socket(SocketType.Stream, ProtocolType.Tcp);

            //绑定本地终结点
            IPEndPoint 本地地址 = new IPEndPoint(IPAddress.Loopback, 6000);
            //绑定本地端点
            服务器.Bind(本地地址);
            //开始临听
            服务器.Listen(10);
            Console.WriteLine($"正在监听客户端连接...\n监听窗口：{本地地址.Port}");
            //接收客户端连接
            Socket 客户端 = 服务器.Accept();
            IPEndPoint 客户端消息 = (IPEndPoint)客户端.RemoteEndPoint;
            Console.WriteLine($"收到客户端连接\n客户端地址：{客户端消息.Address.MapToIPv4()}，端口：{客户端消息.Port}");
            //向客户端发数据
            string 服务器上的消息 = "你好，我是服务器";
            byte[] 数据 = Encoding.UTF8.GetBytes(服务器上的消息);
            //发送数据长度
            客户端.Send(BitConverter.GetBytes(数据.Length));
            //发送数据正文
            客户端.Send(数据);
            //关闭通道
            客户端.Close();
            服务器.Close();

        }


        //客户端
        static void 客户接收()
        {
            Socket 客户的机子 = new Socket(SocketType.Stream, ProtocolType.Tcp);
            //连接服务器
            客户的机子.Connect(IPAddress.Loopback, 6000);
            //接收服务器发送的消息，先读取长度
            byte[] 数据小三 = new byte[sizeof(int)];
            int 文字组  = 0;
            int n = 客户的机子.Receive(数据小三);
            if (n==数据小三.Length)
            {
                文字组 = BitConverter.ToInt32(数据小三, 0);
            }

            //读取数据正文
            数据小三 = new byte[文字组];
            客户的机子.Receive(数据小三);
            string msg = Encoding.UTF8.GetString(数据小三);
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine($"\n客户端接收到的消息的：\n{msg}");
            Console.ResetColor();

            //断开
            客户的机子.Disconnect(false);
            //关才通道
            客户的机子.Close();
        }
    }
}
